<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //使用立即执行的匿名函数作为命名空间来用
        //在立即执行的函数中定义自己的代码

        //在命名空间中向外暴露变量或函数
        // (function () {
        //     var x = 1;
        //     console.log(x);  //1

        //     //给window对象添加了一个属性，其实就是定义了一个全局变量
        //     window.x = x;
        // })();
        // console.log(x);  //1

        // (function (){
        //     var x=100;
        //     console.log(x);
        // })();



        //在函数内部可以定义另一个函数，在外部函数中可以定义内部函数
        function outer() {
            var x = 1;
            console.log('x=', ++x);   //x=2

            function inner() {
                //内部函数可以访问外部函数中的变量
                var y = 1;
                console.log('y=' + y, 'x=' + x);   //y=1 x=2（打印两次）
            }

            inner();//调用内部函数

            return inner;//外部函数将内部函数作为返回值返回
            // console.log(inner);
        }
        // // outer1();
        var fn = outer();//调用外部函数得到内部函数
        // console.log(fn);
        fn();//调用内部函数



        //变量和函数的提升：预先访问(预解析)

        //x：undefined
        //fn：function

        // var x;  //下一行相当于此定义
        // console.log('x=' + x);  //x=undefined
        // var x = 10;
        // console.log('x=' + x);  //x=10

        // console.log('y=' + y);  //y is not defined
        // //未用var声明的变量没有提升
        // y = 10;
        // // console.log('y=' + y);


        //函数表达式方法
        // 该段代码执行之前，会做变量声明提升，fn在提升之后的值是undefined；
        // 而fn调用是在fn被赋值为函数体之前，此时fn的值是undefined，所以无法正确调用
        //此时fn：undefined
        // fn();
        // var fn = function () {   //fn is not a function
        //     console.log('fn');
        // }

        
        // 函数的声明会被提升到当前作用域的最上面，但是不会调用函数。
        // fn();
        // function fn(){
        //     console.log('fn');
        // }
        // // fn();
    </script>
</body>

</html>